home *** CD-ROM | disk | FTP | other *** search
- ; ***************************************************************************
- ; * *
- ; * Hitachi CDR-3600/1600S C D - R O M Device Driver *
- ; * Copyright reserved by Hitachi, Ltd. *
- ; * *
- ; * CDREAD version 8a. *
- ; * *
- ; * This module provides the function CDREAD() which interfaces directly *
- ; * with Hitachi CDR-3600/1600S drivese for IBM PC/XT/AT. *
- ; * *
- ; * *
- ; * History: *
- ; * *
- ; * Created. *
- ; * Mar. 20.1985 -by- TE *
- ; * *
- ; * Modified *
- ; * Sep. 19.1987 -by- TE *
- ; * *
- ; * Modified *
- ; * Mar. 30.1989 -by- T.E *
- ; * *
- ; * Modified (v2.20) *
- ; * Mon Jul 16 1990 -by- Michael Edwards *
- ; * *
- ; * Moved initializing timing variables to CD.ASM's cdrom_init(). *
- ; * *
- ; * Changed installing a timer interrupt routine, and use of the timing *
- ; * variables CLOCK_1 and CLOCK_2, to use the system 18Hz long interger *
- ; * count (at 040:006c) in the routines set_time_1(), set_time_2(), *
- ; * check_time_1() and check_timer2(). *
- ; * *
- ; * Removed all cli/sti's except the pair in the DMA routine. *
- ; * Modified (v2.20) *
- ; * 10/1/90 -by- JohnYG *
- ; * Added some short jumps after assembling with -W2 *
- ; * Final Release (v2.20) *
- ; * *
- ; ***************************************************************************
- ; << for debug >>
- ;---------------------
- FALSE EQU 0
- MSCDEX equ 0 ;for CD-ROM EXT. device driver
- ;-------------------------
-
- INCLUDE CDREAD.AT
-
- PRINT_STRING MACRO
- MOV AH,9
- INT 21H
- ENDM
-
- IN_PB MACRO
- CALL IN_PB_SUB
- ENDM
- PPI_PA MACRO
- MOV DX,BP
- DEC DX
- ENDM
- PPI_PB MACRO
- MOV DX,BP
- ENDM
- PPI_PC MACRO
- MOV DX,BP
- INC DX
- ENDM
- PPI_CR MACRO
- MOV DX,BP
- INC DX
- INC DX
- ENDM
- DATA_PORT MACRO
- MOV DX,BP
- ADD DX,3
- ENDM
- INT_PORT MACRO
- MOV DX,BP
- ADD DX,5
- ENDM
- NOPL MACRO
- JMP SHORT $+2
- ENDM
- ;
- EXTRN ECC :NEAR
-
- PUBLIC CDREAD
- PUBLIC INSB_LOOP
- PUBLIC _INSB_LOOP_ENT
- PUBLIC _STATUS_COMMAND
-
- PUBLIC BUF
- PUBLIC CPU_MODE
- PUBLIC CLOCK_MODE
- PUBLIC CURRENT_IF_MODE
- PUBLIC STA_CODE
- PUBLIC TWICE
- PUBLIC IF_FLAG
- PUBLIC CLOCK_COUNT
- PUBLIC ERRCNT
- PUBLIC CURRENT_IF
-
- _TEXT SEGMENT PARA PUBLIC 'CODE'
- CDREAD PROC FAR
- ASSUME CS:_TEXT,ES:_TEXT,DS:_TEXT
-
- BEGIN: JMP START
-
-
- ;--------------------------------------------------------------------
- DB "CDRD8A Ver. 1.00 "
- DB "FOR PC/XT/AT "
- DB "(C) Copyright Hitachi, Ltd. 1985,1989 "
- ;--------------------------------------------------------------------
- ; M Y W O R K A R E A
- ;----------------------------------------------------------------------
-
- RAW_DATA DB 12 DUP(0)
- HEADER DB 4 DUP(?)
- BUF DB 2340 DUP (?)
-
- BX_SAVE LABEL WORD
- MYDTA_OFF DW ? ;DATA TRANSFER ADDRESS_OFFSET
- ES_SAVE LABEL WORD
- MYDTA_SEG DW ? ; " " " _SEGMENT
- AH_SAVE LABEL BYTE
- COM_CODE DB ? ;COMMAND CODE
- AL_SAVE LABEL BYTE
- CD_TOTAL_AL DB ? ;TOTAL DATA BLOCKS TO READ
- CH_SAVE LABEL BYTE
- CD_MIN DB ? ;MINUTE
- CL_SAVE LABEL BYTE
- CD_SEC DB ? ;SECOND
- DH_SAVE LABEL BYTE
- CD_BLK DB ? ;DATA BLOCK
- DL_SAVE LABEL BYTE
- DRIVE_NO DB ? ;DRIVE NUMBER
- SI_SAVE DW ?
- DI_SAVE DW ?
- S_ES_SAVE DW ?
- S_BX_SAVE DW ?
- ;
- CD_TOTAL DW WORD
- CD_CNT DW ?
- COMC DB 0FFH ;CLEAR COMMAND COUNTER CODE
- COM DB 7 DUP(?) ;COMMAND CODE
- STA_CODE DB 0 ;STATUS CODE
- ERRCNT DB 10 ;ERROR COUNT FOR RETRY
- ;
- CURRENT_IF_B LABEL BYTE
- CURRENT_IF DW 300H
- CURRENT_IF_MODE DB 0FFH ;0FFH - NOT CHECKED, 0 - SOFT OK, 1 - SOFT NG
- CURRENT_DRIVE DB 8 DUP (0FFH)
- ;
- CHK_DRV_WORK LABEL BYTE
- IF_FLAG DB 0
- TWICE DB 0
-
- time_1 dw 0
- time_2 dw 0
-
- PAUSE_FLG DB 0 ;DRIVE PAUSE FLAG
- COM_COUNT DW 1
- TRNS_MODE DB 0 ;0 - SOFT, 1 - DMA
- MODE_SET_TRNS DB 0 ;0 - AUTO(DEFAULT), 1 - DMA ONLY
- DRIVE_NO_MASK DB ? ;DRIVE NUMBER MASK DATA
- CLOCK_MODE DB 0FFH ;0FFH - NOT CHECKED, 0 - CHECKED OK, 1 - NG
- CLOCK_COUNT DB 0
- CPU_MODE DB 0FFH ;0FFH - NOT CHECKED, 0-8088, 2-80286
- GENERAL_FLAG DB 0
- MAX_DRIVE DB 0 ;3 or 7 , 0 - NOT CHECKED
- READ_MODE DB 0 ;0 -- 2048, 1 -- 2352(12*00h+HEADER+2048+EDC/ECC)
- ;
- ;
- ; FUNCTION TABLE
- ;
- FUNCTBL LABEL BYTE
- DW INIT ;0 INITIALIZE
- DW INPUT ;1 READ
- DW SEEK ;2 SEEK
- DW SEEKW ;3 SEEK AND WAIT
- DW STATUS ;4 STATUS
- DW DISKST ;5 DISK STATUS
- ;
- ;------
- ifdef MSCDEX
- DW READ_EXT ;6 READ EXT more than 256 blks
- else
- DW ERROR_COM ;6 reserved
- endif
-
- ;------
- ifdef MSCDEX
- DW UCOM ;7 READ UCOM RAM -- ONLY FOR CD-EXT.
- else
- DW ERROR_COM ;7 reserved
- endif
- ;------
- DW SEEK_TO_LEAD ;8 SEEK TO LEAD IN
- DW READ_SUBQ ;9 READ SUBCODE Q
- DW PAUSE ;A PAUSE
- DW AUDIO ;B AUDIO
- DW STOP ;C STOP
- DW AUDIO_EXT ;D AUDIO EXTENDED (L/R)
- DW AUDIO_TNO ;E AUDIO BY TNO
- DW OPEN ;F OPEN
- DW CLOSE ;10 CLOSE
- DW P_A_MED ;11 PREVENT/ALLOW MEDIUM
- DW SET_POWER ;12 SET POWER SAVE
- DW ERROR_COM ;13 reserved
- ;------
- ifdef MSCDEX
- DW CH_CTRL ;14 Audio ch. control
- else
- DW ERROR_COM ;14 reserved
- endif
- ;------
- DW VERSION ;15 VERSION
- DW ERROR_COM ;16 reserved
- DW MODE_SET ;17 MODE SET
- DW GENERAL ;18 GENERAL
- ;;; dw direct ;19 direct communicate
- ;;; dw read_2352 ;1A read 2352 byte mode
- ;----------------------------------------------------------------------
- ; L O C A L P R O C E D U R E S
- ;----------------------------------------------------------------------
- IN_SAVE PROC NEAR
- MOV BYTE PTR COM_CODE,AH ;SAVE COMMAND CODE
- MOV CD_TOTAL_AL,AL
- MOV BYTE PTR CD_MIN,CH
- MOV CD_SEC,CL
- MOV BYTE PTR CD_BLK,DH
- MOV DRIVE_NO,DL
- MOV MYDTA_OFF,BX ;SAVE DTA ADDRESS_OFFSET
- MOV MYDTA_SEG,ES ; _SEGMENT
- MOV DI_SAVE,DI
- MOV SI_SAVE,SI
- RET
- IN_SAVE ENDP
- ;----------------------------------------------------------------------
- ; BINARY TO BCD
- ; INPUT CD_MIN MINUTE in binary
- ; CD_SEC SECOND " "
- ; CD_BLK BLOCK " "
- ; OUTPUT COM+1 MINUTE in BCD
- ; COM+2 SECOND " "
- ; COM+3 BLOCK " "
- ;
- ;----------------------------------------------------------------------
- BCD PROC NEAR ;CONVERT BINARY TO BCD CODE
- MOV CX,3 ;SET 3 IN COUNTER
- MOV DI,CS
- MOV ES,DI ;SET PTR COM+1 IN ES:DI
- MOV DI,OFFSET COM+1
- MOV SI,OFFSET CD_MIN ;SET PTR CD_MIN IN DS:SI
- BCD_S:
- MOV BL,10 ;SET 10 AS DIVISOR
- BCD_1: ;CONVERT CD_X TO BCD AND STORE IN COM+X
- XOR AH,AH
- LODSB
- DIV BL
- SHL AL,1 ; AL=UPPER DIGIT, AH=LOWER DIGIT
- SHL AL,1 ; MULTIPLY AL BY BCD 10
- SHL AL,1
- SHL AL,1 ; NOW UPPER DIGIT IN UPPER NIBBLE OF AL
- ADD AL,AH ; ADD AH AND AL TO GET BCD CODE
- STOSB ; STORE IT IN COM+X
- LOOP BCD_1
- RET
- BCD ENDP
- ;----------------------------------------------------------------------
- ; UPDATE DATA BLOCK NUMBER
- ; INPUT/OUTPUT MYDTA DTA Address
- ; CD_MIN Minute
- ; CD_SEC Second
- ; CD_BLK Data Block
- ; OUTPUT CY 1 = Out of Range, 0 = No Error
- ;
- ;----------------------------------------------------------------------
- UPDATE PROC NEAR
- ADD WORD PTR MYDTA_OFF,2048 ;UPDATE DATA TRANSFER ADDRESS
- JNC UPD_1 ;
- JMP SHORT UPD_0
- UPDATE_2352:
- ADD WORD PTR MYDTA_OFF,2352 ;UPDATE DATA TRANSFER ADDRESS
- JNC UPD_1 ;
- UPD_0:
- ADD WORD PTR MYDTA_SEG,1000H ; INCREMENT SEGMENT
- ;;; JMP SHORT UPD_1
- UPD_1: XOR AL,AL
- INC BYTE PTR CD_BLK ;INCREMENT DATA BLOCK
- CMP BYTE PTR CD_BLK,MAX_BLOCK ;CHECK DATA BLOCK >= 75
- JB OK_UPDATE ;IF LESS THAN 75, RETURN
- MOV BYTE PTR CD_BLK,AL ;SET DATA BLOCK 0
- INC BYTE PTR CD_SEC ;INCREMENT SECOND
- CMP BYTE PTR CD_SEC,MAX_SECOND ;CHECK SECOND >= 60
- JB OK_UPDATE ;IF LESS THAN 60, RETURN
- MOV BYTE PTR CD_SEC,AL ;SET SECOND 0
- INC BYTE PTR CD_MIN ;INCREMENT MINUTE
- CMP BYTE PTR CD_MIN,MAX_MINUTE ;CHECK MINUTE >= MAX_MINUTEUTE
- OK_UPDATE:
- CMC
- RET
- UPDATE ENDP
- ;----------------------------------------------------------------------
- ; CHECK ID
- ; INPUT CD_MIN etc. Data Block Number
- ; BUF ID of CD-ROM Data
- ; OUTPUT ZR 1 = ID Error, 0 = No Error
- ;
- ;----------------------------------------------------------------------
- CHK_ID PROC NEAR
- CALL BCD ;CONVERT DATA BLOCK NUMBER IN BCD
- MOV AX,WORD PTR COM+1 ;CHECK ID
- CMP AX,WORD PTR BUF ; CHECK MINUTE AND SECOND
- JNZ CHK_ID_E ; JUMP IF ID ERROR
- MOV AL,BYTE PTR COM+3 ; M AND S IS O.K. CHECK BLOCK
- CMP AL,BYTE PTR BUF+2 ; CHECK DATA BLOCK
- JNZ CHK_ID_E ; JUMP IF DATA BLOCK ERROR
- INC AL ; RESET ZR
- RET ;NORMAL RETURN
- CHK_ID_E:
- XOR AL,AL ;SET ZR
- RET ;ERROR RETURN
- CHK_ID ENDP
- ;----------------------------------------------------------------------
- ; CHECK DRIVE
- ;
- ; INPUT None
- ; OUTPUT ZR 1 = Drive not ready, 0 = No Error
- ;
- ;----------------------------------------------------------------------
- CHK_DR PROC NEAR
- mov time_2,T_OVER4
- call set_time_2 ;15 SEC
- JMP SHORT CHK_D2
- CHK_DR_INPUT:
- mov time_2,T_OVER2
- call set_time_2 ;3 SEC
- CHK_D2: CALL STATUS_COMMAND ; READ CD-ROM STATUS
- JZ CHK_DE ; JUMP IF TIME OUT
- MOV AL,BYTE PTR STA_CODE ; LOAD STATUS
- TEST AL,DRIVE_READY ; TEST DRIVE READY
- JZ CHK_D1 ; JUMP IF DRIVE READY
-
- call check_time_2
-
- JNZ CHK_D2 ;LOOP UNTIL TIME OUT
- CHK_DE: RET ;TIME OUT ERROR
- CHK_D1: INC AL ;CLEAR ZR
- RET
- CHK_DR ENDP
- ;------------------------------------------------------------
- ; READ ONE DATA BLOCK FROM DRIVE TO CALLER'S DTA
- ;
- ; INPUT MYDTA Data Transfer Address
- ; CD_MIN etc. Data Block Number
- ; OUTPUT Data in DTA
- ; CY 1 = ECC ERROR, 0 = NO ERROR
- ;------------------------------------------------------------
- SECREAD PROC NEAR
- MOV DI,CS ;SET BUF_SEGMENT TO ES
- MOV ES,DI ;TRANSFER 4 BYTES (ID) TO BUFFER
- LEA DI,BUF ;SET BUF_OFFSET TO DI
- CMP TRNS_MODE,0
- JZ SECR_SOFT
- SECR_3: MOV CX,4 ; SET DMA COUNTER
- SECR_1: CALL DMA ; DMA CDROM -> BUFFER
- JZ SECR_E ;JUMP IF DMA TIME OUT
- MOV AX,WORD PTR BUF
- MOV WORD PTR HEADER,AX
- MOV AX,WORD PTR BUF+2
- MOV WORD PTR HEADER+2,AX
- CALL CHK_ID ;CHECK ID
- JZ SECR_E ; JUMP IF ID ERROR
- MOV DI,MYDTA_OFF
- MOV ES,MYDTA_SEG
- CMP READ_MODE,0
- JE SECR_2
- PUSH SI
- MOV SI,OFFSET RAW_DATA
- MOV CX,16
- ;-------
- MOV AX,CX
- ADD AX,DI
- JNC SECR_1_1
- SUB CX,AX
- REP MOVSB
- MOV CX,ES
- ADD CX,1000H
- MOV ES,CX
- MOV CX,AX
- CMP CX,0
- JZ SECR_1_2
- SECR_1_1:
- REP MOVSB
- SECR_1_2:
- POP SI
- SECR_2: MOV CX,2048 ;TRANSFER DATA TO DTA
- CMP READ_MODE,0
- JE SECR_4
- MOV CX,2048+288
- SECR_4:
- CALL DMA ; DMA CD-ROM -> DTA
- JNE SECR_DEND_END
- SECR_E:
- RET
- ;--------< SOFT READ >------------
- SECR_SOFT:
- CALL SECR_4B
- SECR_S_4:
- MOV AX,WORD PTR BUF
- MOV WORD PTR HEADER,AX
- MOV AX,WORD PTR BUF+2
- MOV WORD PTR HEADER+2,AX
- CALL CHK_ID ;CHECK ID
- JZ SECR_E ; JUMP IF ID ERROR
- MOV DI,MYDTA_OFF
- MOV ES,MYDTA_SEG
- CMP READ_MODE,0
- JE SECR_S_4_3
- PUSH SI
- MOV SI,OFFSET RAW_DATA
- MOV CX,16
- ;-------
- MOV AX,CX
- ADD AX,DI
- JNC SECR_S_4_1
- SUB CX,AX
- REP MOVSB
- MOV CX,ES
- ADD CX,1000H
- MOV ES,CX
- MOV CX,AX
- CMP CX,0
- JZ SECR_S_4_2
- SECR_S_4_1:
- REP MOVSB
- SECR_S_4_2:
- POP SI
- SECR_S_4_3:
- CMP CPU_MODE,2
- JE SECR_S_5
- CALL BOUND_CHECK ;<1>
- CMP READ_MODE,0
- JNE SECR_S_4_4
- CALL NDMA_88_2048
- JMP SHORT SECR_DEND_END
- SECR_S_4_4:
- CALL NDMA_88_2336
- SECR_DEND_END:
- MOV AH,50
- JMP SHORT DEND_PROC_1
- SECR_S_5:
- MOV CX,2048
- CMP READ_MODE,0
- JE SECR_S_5_1
- MOV CX,2048+288
- SECR_S_5_1:
- CALL INSB_LOOP_ENT_SUB
- MOV AH,120 ;DEND PROCEDURE
- DEND_PROC_1:
- PPI_PC ;CHANGE DRIVE TO COMMAND MODE
- MOV AL,DEND_IN ; LOAD DEND CODE
- OR AL,DRIVE_NO_MASK ;SET DRIVE SELECT
- OUT DX,AL ; SET DEND
- SECR_S_DEND:
- DEC AH
- JNZ SECR_S_DEND
- MOV AL,CLR_IN ; LOAD DEND RESET CODE
- OR AL,DRIVE_NO_MASK ;SET DRIVE SELECT
- OUT DX,AL ; RESET DEND, RESET ZR
- RET
-
- SECR_4B: ;READ 4 BYTES (HEADER)
- DATA_PORT
- MOV CX,4 ;READ HEADER ( 4 bytes )
- CMP CPU_MODE,2
- JE SECR_S_3 ;80286
- CALL BOUND_CHECK ;<1>
- SECR_S_2:
- IN AL,DX
- STOSB
- JMP SHORT $+2
- JMP SHORT $+2
- LOOP SECR_S_2
- RET
- SECR_S_3:
- CALL INSB_LOOP_ENT_SUB ;<1>
- RET
-
- BOUND_CHECK:
- PUSH AX
- MOV AX,2340
- ADD AX,DI
- JNC BOUND_RET
- MOV AX,ES
- ADD AX,100H ;+4096
- MOV ES,AX
- SUB DI,1000H
- BOUND_RET:
- POP AX
- RET
- SECREAD ENDP
-
- ;----------------------------------------------------------------------
- ; READ ONE DATA BLOCK TO BUFFER AND CORRECT
- ;
- ; INPUT MYDTA Data Transfer Address
- ; CD_MIN etc. Data Block Number
- ; OUTPUT Data in DTA
- ; CY 1 = ECC ERROR, 0 = NO ERROR
- ; ZR 1 = Time Out Error, 0 = No Error
- ;
- ;----------------------------------------------------------------------
- ER_CORRECT PROC NEAR
- MOV DI,CS ;TRANSFER ALL DATA OF THE BLOCK TO BUFFER
- MOV ES,DI ; LOAD SEGMENT IN ES
- LEA DI,BUF ; LOAD OFFSET IN DI
- CMP TRNS_MODE,0
- JNE ER_COR_1
- JMP ER_SOFT ;JE ER_SOFT
- ER_COR_1:
- MOV CX,2340 ; SET 4+2048+288 IN CX
- CALL DMA ; DMA CD-ROM -> BUFFER
- JNZ ECC_CHK
- JMP ERC_E1 ;JZ ERC_E1 ;JUMP IF DMA TIME OUT
-
- ECC_CHK:
- MOV BYTE PTR PAUSE_FLG,0FFH ;SET PAUSE FLUG
- CALL PAUSE_COMMAND ;ISSUE PAUSE COMMAND
- JZ ERC_E1 ;JUMP IF COMMAND FAILED
- CALL ECC ;ECC DECODE
-
- ;----------------------------------------------------------------------
- ; ECC is a subroutine which corrects the data errors of the CD_ROM.
- ; Almost all data errors should have been corrected by CDR-1502S's data
- ; processing LSI using CD's error correct code ( Ccross Interleave
- ; Reed-Solomon Code ) and this subroutine may not be necessary. But if
- ; there are some fatal defects on the disc and some errors cannot be
- ; corrected by data processing LSI, they may be corrected with ECC
- ; routine using additional Layered Error Correct Code. Object module
- ; of ECC is stored in ECC.OBJ. Please link ECC.OBJ and CDREAD.OBJ
- ; together with your software when you use them.
- ;----------------------------------------------------------------------
- ; ECC INPUT Data in BUF
- ; ID 4 Bytes
- ; Data 2048 Bytes
- ; Layered ECC 288 Bytes
- ; OUTPUT Corrected Data in BUF
- ; CY 1 = ECC Error, 0 = No Error
- ;----------------------------------------------------------------------
- MOV CX,CS
- MOV DS,CX
- JC ERC_E2 ;JUMP IF ECC FAILED
- MOV AX,WORD PTR BUF
- MOV WORD PTR HEADER,AX
- MOV AX,WORD PTR BUF+2
- MOV WORD PTR HEADER+2,AX
- CALL CHK_ID ;CHECK ID
- JZ ERC_E1 ;JUMP IF ID ERROR
- MOV CX,CS
- MOV DS,CX
- MOV ES,MYDTA_SEG ; LOAD ES:DTA_SEGMENT
- MOV DI,MYDTA_OFF ; LOAD DI:DTA_OFFSET
- CMP READ_MODE,0
- JE ECC_S_4_3
- PUSH SI
- MOV SI,OFFSET RAW_DATA
- MOV CX,16
- ;-------
- MOV AX,CX
- ADD AX,DI
- JNC ECC_S_4_1
- SUB CX,AX
- REP MOVSB
- MOV CX,ES
- ADD CX,1000H
- MOV ES,CX
- MOV CX,AX
- CMP CX,0
- JZ ECC_S_4_2
- ECC_S_4_1:
- REP MOVSB
- ECC_S_4_2:
- POP SI
- ECC_S_4_3:
- MOV SI,OFFSET BUF+4 ; LOAD SI:BUF+4_OFFSET
- MOV CX,2048 ; LOAD CX:2048
- CMP READ_MODE,0
- JE ECC_S_4_4
- MOV CX,2048+288
- ECC_S_4_4:
- ;
- MOV AX,CX
- ADD AX,DI
- JNC ER_COR_2
- SUB CX,AX
- REP MOVSB
- MOV CX,ES
- ADD CX,1000H
- MOV ES,CX
- MOV CX,AX
- CMP CX,0
- JZ ER_COR_3
- ;
- ER_COR_2:
- REP MOVSB ;SOFTWARE TRANSFER
- ER_COR_3:
- OR AL,1 ;CLEAR ZR - OK
- ERC_E1: CLC ;CLEAR CY
- ERC_E2: RET
- ER_SOFT:
- CMP CPU_MODE,2
- JE ER_SOFT_1
- CALL BOUND_CHECK
- CALL SECR_4B ;READ 4 B
- ;
- CALL NDMA_88_2336
- JMP ECC_CHK
- ER_SOFT_1:
- MOV CX,2340
- CALL INSB_LOOP_ENT_SUB
- JMP ECC_CHK
- ER_CORRECT ENDP
-
-
-
- INSB_LOOP_ENT_SUB proc near
- MOV AX,CX
- ADD AX,DI
- JNC INSB_L_SUB_1
- SUB CX,AX
- CALL INSB_LOOP_ENT
- MOV CX,ES
- ADD CX,1000H
- MOV ES,CX
- MOV CX,AX
- CMP CX,0
- JZ INSB_L_SUB_2
- INSB_L_SUB_1:
- CALL INSB_LOOP_ENT
- INSB_L_SUB_2:
- OR AL,1
- CLC
- RET
- INSB_LOOP_ENT_SUB endp
-
-
- NDMA_88_2048:
- MOV CX,64
- JMP SHORT NDMA_88_1
- NDMA_88_2336:
- MOV CX,73
- NDMA_88_1:
- MOV AL,CLOCK_COUNT
- CMP AL,1
- JBE INSB_LOOP_ENT
- SHL CX,1 ;CX * 2
- CMP AL,3
- JBE INSB_LOOP_ENT
- SHL CX,1
- SHL CX,1
- SHL CX,1
- SHL CX,1 ;CX * 16
-
- INSB_LOOP_ENT:
- DATA_PORT
- EVEN
- INSB_LOOP:
- IN AL,DX
- STOSB
- DB 126 DUP(90H) ;NOP
- RET
-
- ;
- ; far entry point to INSB_LOOP_ENT from _LAST segment
- ;
- _INSB_LOOP_ENT proc far
- call INSB_LOOP_ENT
- ret
- _INSB_LOOP_ENT endp
-
- ;----------------------------------------------------------------------
- ; COMMAND PROCEDURES
- ;----------------------------------------------------------------------
- COMMAND PROC NEAR
- AUDIO_TNO_COMMAND:
- MOV AL,AL_SAVE
- OR AL,COMAUDIO_TNO
- MOV COM,AL
- MOV AL,CD_MIN
- MOV BYTE PTR COM+1,AL
- MOV AL,CD_SEC
- MOV BYTE PTR COM+2,AL
- MOV SI,OFFSET COM+1
- MOV DI,SI
- MOV CX,CS
- MOV ES,CX
- MOV CX,2
- CALL BCD_S
- MOV CX,4
- JMP COMEN
- CH_CTRL_COMMAND:
- MOV AL,AL_SAVE
- OR AL,0D0H
- MOV COM,AL
- JMP COMMAND_1B
- STOP_COMMAND:
- MOV COM,COMSTOP
- JMP COMMAND_1B
- OPEN_COMMAND:
- MOV WORD PTR COM,COMOPEN
- JMP SHORT COMMAND_2B
- CLOSE_COMMAND:
- MOV WORD PTR COM,COMCLOSE
- COMMAND_2B:
- MOV CX,3
- JMP short COMEN
-
- SET_POWER_COMMAND:
- MOV COM,COMPOWER
- MOV AL,AL_SAVE
- MOV BYTE PTR COM+1,AL
- MOV SI,OFFSET COM+1
- MOV DI,SI
- MOV CX,CS
- MOV ES,CX
- MOV CX,1
- CALL BCD_S
- MOV CX,3
- JMP short COMEN
- AUDIO_COMMAND:
- MOV DI,OFFSET COM+1
- MOV SI,MYDTA_OFF
- MOV DS,MYDTA_SEG
- MOV CX,CS
- MOV ES,CX
- MOV CX,6
- REP MOVSB
- MOV CX,CS
- MOV DS,CX
- MOV AL,AL_SAVE
- OR AL,COMAUDIO
- MOV COM,AL
- MOV CX,6
- MOV SI,OFFSET COM+1
- MOV DI,SI
- CALL BCD_S
- MOV CX,8
- JMP short COMEN
- READ_COMMAND: ;ISSUE READ COMMAND
- MOV BYTE PTR COM,COMREAD ; SET READ COMMAND
- COMMAND_4B:
- CALL BCD ; CONVERT DATA BLOCK NUMBER TO BCD CODE
- COMMAND_4B_1:
- MOV CX,5 ; SET COUNTER 4 + 1 (C.C.C.)
- JMP SHORT COMEN ;JUMP TO COMMON ENTRY POINT
- SEEK_COMMAND: ;ISSUE SEEK COMMAND
- MOV BYTE PTR COM,COMSEEK ; SET SEEK COMMAND
- JMP SHORT COMMAND_4B ;JUMP TO COMMAND_4B
- PAUSE_COMMAND: ;ISSUE PAUSE COMMAND
- MOV BYTE PTR COM,COMPAUSE ; SET PAUSE COMMAND
- JMP SHORT COMMAND_1B ;JUMP TO COMMAND_1B
- SEEK_LEAD_COMMAND:
- MOV BYTE PTR COM,COMLEADIN
- JMP SHORT COMMAND_1B
- RESET_COMMAND: ;ISSUE RESET COMMAND
- MOV BYTE PTR COM,COMRESET ; SET RESET COMMAND
- COMMAND_1B:
- MOV CX,2 ; SET COUNTER 1 + 1 (C.C.C.)
- JMP SHORT COMEN ;JUMP TO COMMAND ROUTINE
- ;----------------------------------------------------------------------
- ; OUTPUT COMMAND TO DRIVE
- ;
- ; INPUT CX COMMAND LENGTH + 1
- ; CS:COM COMMAND CODE
- ; CS:COM+1 MINUTE (BCD)
- ; CS:COM+2 SECOND "
- ; CS:COM+3 DATA BLOCK "
- ; OUTPUT ZF 1 = TIME OUT ERROR, 0 = NO ERROR
- ;----------------------------------------------------------------------
- COMEN:
- MOV GENERAL_FLAG,0
- COMEN_SUB:
-
- LEA SI,BUF
-
- CMP GENERAL_FLAG,1
- JE COMEN_SUB_1
- LEA SI,BYTE PTR COMC ;OUTPUT C.C.C AND COMMAND CODES
- CMP CX,1
- JNZ COMEN_SUB_1
- LEA SI,BYTE PTR COM ;OUTPUT COMMAND CODES
- COMEN_SUB_1:
- MOV BL,DRIVE_NO_MASK
- CALL COM_END_SUB
- IN_PB
- TEST AL,BUS_BUSY ; IS BUS BUSY(DMA MODE)?
- JZ COM_1 ; JUMP IF BUS IS READY(COMMAND MODE)
- INC DX ; PPI_PC
- MOV AL,DEND_IN ; LOAD DEND CODE
- OR AL,BL
- OUT DX,AL ; SET DEND
- mov time_1,T_OVER1
- call set_time_1 ;SET 1 SEC
- COM_2: IN_PB
- TEST AL,BUS_BUSY ; CHECK BUS_BUSY
- JZ COM_6 ; JUMP IF CDROM IS READY
-
- call check_time_1
-
- JNZ COM_2 ; LOOP UNTIL BUS_BUSY RESET
- JMP short COM_E ; JUMP IF TIME OUT
- COM_6: INC DX ;NOW CDROM IS READY, RESET DEND
- MOV AL,CLR_IN ; LOAD DEND RESET CODE
- OR AL,BL
- OUT DX,AL ; RESET DEND
- COM_1:
- mov time_1,T_OVER1
- call set_time_1 ;SET 1 SEC
- COM_1_1:
-
- call check_time_1
- jnz @f
- jmp short COM_E
- @@:
- ; JZ COM_E ; JUMP IF TIME OUT
- IN_PB
- TEST AL,ACK ; TEST ACK
- JNZ COM_1_1 ; LOOP UNTIL ACK OFF
- COM_1_2:
- PPI_CR ;SET PPI_PA OUTPUT MODE
- MOV AL,PAOUT ;
- OUT DX,AL ; PPI_CR <- PAOUT
- DEC DX ;PPI_PC
- MOV AL,CLR_OUT ; LOAD BUS DIR OUT CODE
- OR AL,BL
- JMP $+2
- OUT DX,AL ; BUS_DIR OUT
- COM_4:
- PPI_PA
- LODSB
- OUT DX,AL ; OUTPUT COMMAND CODE
- CMP IF_FLAG,1
- JNE COM_4_1
- DATA_PORT
- MOV AL,0FFH
- OUT DX,AL
- COM_4_1:
- PPI_PC
- MOV AL,CMD_OUT
- OR AL,BL
- OUT DX,AL
-
- mov time_1,T_OVER1
- call set_time_1 ;SET 1 SEC
- COM_3:
-
- call check_time_1
-
- JZ COM_E ; JUMP IF TIME OUT
- IN_PB ; LOAD ACK
- TEST AL,ACK ; TEST ACK
- JZ COM_3
- COM_7: MOV AL,CLR_OUT ; RESET CMD
- OR AL,BL
- INC DX ;PPI_PC
- OUT DX,AL ;
- mov time_1,T_OVER1
- call set_time_1 ;SET 1 SEC
- COM_5:
-
- call check_time_1
-
- JZ COM_E ; JUMP IF TIME OUT
- IN_PB ; LOAD ACK
- TEST AL,ACK ; TEST ACK
- JNZ COM_5 ; LOOP UNTIL ACK OFF
- COM_8:
- LOOP fix_this_mike ;LOOP UNTIL ALL COMMAND CODES HAVE BEEN SENT
- OR DX,1 ;RESET ZR
- COM_E:
- PUSHF
- CALL COM_END_SUB
- POPF
- RET
-
- fix_this_mike:
- jmp COM_4
-
- IN_PB_SUB:
- MOV DX,BP
- IN_PB_1:
- IN AL,DX ;LOAD PPI PORT_B
- AND AL,03H ;MASK RESERVED BITS
- RET
- COM_END_SUB:
- PPI_CR ;SET PPI PORT_A INPUT MODE
- MOV AL,PAIN ;
- OUT DX,AL ; PPI_CR <- PAIN
- DEC DX ;PPI_PC
- MOV AL,CLR_IN ; LOAD CLEAR & BUS_DIR IN CODE
- OR AL,BL
- JMP $+2
- OUT DX,AL ; CLEAR & BUS_DIR IN
- RET
- COMMAND ENDP
- ;----------------------------------------------------------------------
- ; STATUS READ PROCEDURES
- ;----------------------------------------------------------------------
- COMSTATUS PROC NEAR ;STATUS READ
- GENERAL_COMMAND:
- MOV CL,AL_SAVE
- XOR CH,CH
- CMP CL,0
- JNE GENERAL_COM_1
- JMP COMST_END
- GENERAL_COM_1:
- LEA DI,BUF+1
- PUSH CX
- MOV SI,SI_SAVE
- INC SI
- INC SI ;POINT AT HEAD OF SEND-DATA
- MOV AX,DI_SAVE
- MOV DS,AX
- MOV AX,CS
- MOV ES,AX
- REP MOVSB
- MOV AX,CS
- MOV DS,AX
- MOV BYTE PTR BUF,0FFH
- MOV GENERAL_FLAG,1
- POP CX
- INC CX
- CALL COMEN_SUB
- JNZ GENERAL_COM_2
- JMP COMST_END
- GENERAL_COM_2:
- MOV CH,CH_SAVE
- MOV CL,CL_SAVE
- MOV COM_COUNT,CX
- CMP CX,0
- JNZ GENERAL_COM_3
- JMP COMST_END
- GENERAL_COM_3:
- JMP READ_SUB
-
-
- ;
- ; far entry point to STATUS_COMMAND from _LAST segment
- ;
- _STATUS_COMMAND proc far
- call STATUS_COMMAND
- ret
- _STATUS_COMMAND endp
-
-
- STATUS_COMMAND: ;ISSUE STATUS COMMAND
- MOV COM,COMST ; SET STATUS COMMAND
- JMP SHORT STATUS_1
- DSKSTA_COMMAND: ;ISSUE DISK_STATUS COMMAND
- MOV COM,COMDSKST ; SET DISK_STATUS COMMAND
- JMP SHORT STATUS_1
- P_A_MED_COMMAND:
- MOV COM,COMLOCK
- CMP AL_SAVE,0
- JZ STATUS_1
- OR COM,08H
- CMP AL_SAVE,2
- JZ STATUS_1
- OR COM,01H
- STATUS_1:
- MOV CX,1 ; SET COMMAND COUNTER
- CALL COMEN ; OUTPUT C.C.C. & STATUS COMMAND
- JZ COMST_END_1 ;JUMP IF COMMAND ERROR
- MOV WORD PTR COM_COUNT,1
- MOV DI,CS
- MOV ES,DI
- MOV DI,OFFSET STA_CODE
- JMP short STATUS_LOOP
- READ_SUBQ_COMMAND:
- MOV COM,COMSUBQ ;READ SUBCODE Q COMMAND
- MOV CX,1
- CALL COMEN
- JZ COMST_END_1
- READ_SUB_C_1:
- MOV WORD PTR COM_COUNT,10
- JMP SHORT READ_SUB
- READ_PORT_COMMAND:
- MOV WORD PTR COM,COMPORT_1
- MOV WORD PTR COM+2,COMPORT_2
- MOV CX,5
- CALL COMEN
- JZ COMST_END_1
- MOV WORD PTR COM_COUNT,30
- JMP SHORT READ_SUB
- UCOM_COMMAND:
- MOV BYTE PTR COM,30H
- MOV BYTE PTR COM+1,90H
- MOV BYTE PTR COM+2,90H
- MOV BYTE PTR COM+3,82H
- MOV CX,5
- CALL COMEN
- JZ COMST_END_1
- MOV WORD PTR COM_COUNT,192
- JMP SHORT READ_SUB
- VERSION_COMMAND:
- MOV WORD PTR COM,COMID_1
- MOV WORD PTR COM+2,COMID_2
- MOV CX,5
- CALL COMEN
- JNZ VERSION_1_COM
- COMST_END_1:
- JMP short COMST_END
- VERSION_1_COM:
- MOV WORD PTR COM_COUNT,52
-
- READ_SUB:
- MOV DI,WORD PTR MYDTA_OFF
- MOV ES,WORD PTR MYDTA_SEG
- ;----------------------------------------------------------------------
- ; READ CD-ROM STATUS
- ;
- ; INPUT ES:DI
- ; COM_COUNT
- ; OUTPUT ES:DI DATA FROM CD_ROM
- ; ZR 1 = TIME OUT ERROR, 0 = NO ERROR
- ;----------------------------------------------------------------------
- STATUS_LOOP:
- MOV BL,CS:DRIVE_NO_MASK
- PPI_PC
- MOV AL,CMD_IN ; LOAD SET CMD CODE
- OR AL,BL
- OUT DX,AL ; SET CMD
- mov time_1,T_OVER1
- call set_time_1 ;SET 1 SEC
- EVEN
- COMST_3:
-
- call check_time_1
-
- JZ COMST_END ; JUMP IF TIME OUT ERROR
- IN_PB ; READ PPI_PB
- TEST AL,ACK ; TEST ACK
- JZ COMST_3 ;LOOP UNTIL ACK ON
- PPI_PA
- IN AL,DX ; READ PPI_PA
- NOP
- STOSB
- PPI_PC
- MOV AL,CLR_IN ; LOAD CMD RESET CODE
- NOP
- OR AL,BL
- OUT DX,AL ; RESET CMD
- mov time_1,T_OVER1
- call set_time_1 ;SET 1 SEC
- COMST_5:
-
- call check_time_1
-
- JZ COMST_END ; JUMP IF TIME OUT ERROR
- IN_PB
- TEST AL,ACK ; TEST ACK
- JNZ COMST_5 ;IF ACK IS ON,THEN WAIT AGAIN
- DEC WORD PTR COM_COUNT
- JZ COM_ST_NRT ;NORMAL RETURN
- JMP STATUS_LOOP
- COM_ST_NRT:
- AND DX,DX ;RESET ZR
- COMST_END:
- PUSHF
- CALL COM_END_SUB
- POPF
- RET
- COMSTATUS ENDP
- ;----------------------------------------------------------------------
- ; DMA PROCEDURE
- ; INPUT ES:SEGMENT OF DATA TRANSFER ADDRESS
- ; DI:OFFSET " " " "
- ; CX:TRANSFER COUNT
- ; OUTPUT ZR 1 = DMA TIME OUT ERROR, 0 = NO ERROR
- ;----------------------------------------------------------------------
- DMA PROC NEAR
- MOV AX,DI ;CALCULATE PAGE AND TRANSFER ADDRESS
- MOV DX,AX ; AX,DX <- OFFSET
- MOV BX,ES ; BX <- SEGMENT
- SHR AX,1 ; DIVIDE AX BY 16
- SHR AX,1
- SHR AX,1
- SHR AX,1
- ADD AX,BX ; GET TOTAL ADDRESS EXCEPT LOWER 4 BYTES
- MOV BX,AX ; STORE IT IN BX
- AND AX,0F000H ; GET PAGE ADDRESS IN AX
- SHR AX,1 ; DIVIDE BY 16
- SHR AX,1
- SHR AX,1
- SHR AX,1
- AND DX,000FH ; GET TRANSFER ADDRESS
- SHL BX,1 ; MULTIPLY BX BY 16
- SHL BX,1
- SHL BX,1
- SHL BX,1
- ADD BX,DX ; ADD TOTAL ADDRESS LOWER 4 BYTES
- MOV DX,BX ; STORE IT IN DX
- DEC BX ;CHECK PAGE ADDRESS SHOULD BE UPDATED OR NOT
- ADD BX,CX ; CALCULATE LAST TRANSFER ADDRESS
- JC DMA_1 ; IF CARRY = 1, THEN PAGE ADDRESS WILL BE UPDATED
- DMA_2: CALL DMA_SUB ;PAGE ADDRESS DOES NOT CHANGE, DMA IN BEGINNING PAGE
- DMA_3: RET ;DMA END
- DMA_1: AND DX,DX ;CHECK TRANSFER ADDRESS = 0
- JZ DMA_2 ; IF TRANSFER ADDRESS IS 0, PAGE ADDRESS NEVER CHANGES
- ADD BX,01H ;GET COUNT IN NEXT PAGE
- SUB CX,BX ;GET COUNT WITHIN BEGINNING PAGE
- PUSH AX ;SAVE PAGE ADDRESS
- PUSH BX ;SAVE COUNT OF NEXT PAGE
- CALL DMA_SUB ;DMA WITHIN BEGINNING PAGE
- POP CX ;RESTORE COUNT OF NEXT PAGE
- POP AX ;RESTORE PAGE ADDRESS
- JZ DMA_3 ;JUMP IF DMA ERROR HAPPENED
- INC AH ;DMA IN NEXT PAGE UPDATE PAGE ADDRESS
- XOR DX,DX ; CLEAR TRANSFER ADDRESS
- JMP SHORT DMA_2 ; DMA TRANSFER AGAIN IN NEXT PAGE
- DMA ENDP
- ;----------------------------------------------------------------------
- ; DMA_SUB PROCEDURE
- ; INPUT AH PAGE ADDRESS
- ; CX TRANSFER COUNT
- ; DX TRANSFER ADDRESS
- ; OUTPUT ZR 1 = DMA TIME OUT ERROR, 0 = NO ERROR
- ;
- ;----------------------------------------------------------------------
- DMA_SUB PROC NEAR ;
- CLI ;MASK INTERRUPT
- OUT DMAC_CLR,AL ;CLEAR FIRST/LAST FLAG
- JMP SHORT $+2
- IN AL,DMAC_STA ;DUMMY READ --- CLEAR CT FLAG OF DMAC
- MOV AL,DMACOM ;SET DMAC COMMAND REGISTER
- JMP $+2
- OUT DMAC_COM,AL ;
- MOV AL,DMAMODE ;SET DMAC MODE REGISTER
- JMP $+2
- OUT DMAC_MODE,AL ;
- MOV AL,AH ;
- JMP SHORT $+2
- OUT DMAC_PAGE,AL ;SET PAGE REGISTER
- MOV AL,DL ;
- JMP SHORT $+2
- OUT DMAC_AD,AL ;SET DMAC ADDRESS REG.
- MOV AL,DH ;
- JMP SHORT $+2
- OUT DMAC_AD,AL ; "
- DEC CX ;SET TERMINAL COUNT
- MOV AL,CL ; TOTAL COUNT - 1
- JMP SHORT $+2
- OUT DMAC_TC,AL ;SET DMAC TERMINAL COUNT REG.
- MOV AL,CH ;
- JMP SHORT $+2
- OUT DMAC_TC,AL ; "
- STI ;ENABLE INTERRUPT
- PPI_PC
- MOV AL,DMAE_IN ; AL <- 80H
- OR AL,DRIVE_NO_MASK
- OUT DX,AL ; PPI_PC <- AL
- MOV AL,DMAENA ;SET DMA CH3 ENABLE
- OUT DMAC_MSK,AL ; "
- XOR BX,BX
- DMA_S1: IN AL,DMAC_STA ;CHECK DMA TERMITATE
- TEST AL,08H ; TEST TERMINAL COUNT FLAG
- JNZ DMA_S2 ; JUMP IF DMA TERMINATED
- DEC BX ; DECREMENT TIMER
- JZ DMA_SE ; JUMP IF TIME OUT ERROR
- JMP DMA_S1 ;WAIT UNTIL DMA TERMINATE
- DMA_S2: MOV AL,CLR_IN ;DMA TERNINATED NORMALLY
- PUSHF
- OR AL,DRIVE_NO_MASK
- POPF
- OUT DX,AL ; DISABLE DMA
- RET ;DMA END
- DMA_SE: MOV AL,DMADIS ;DMA TIME OUT ERROR
- OUT DMAC_MSK,AL ; DISABLE DMAC
- JMP DMA_S2 ;
- DMA_SUB ENDP
- PAGE
- ;--------------------------------------
- ; M A I N R O U T I N E
- ;--------------------------------------
- START:
- CLD
- PUSH DS ;PRESERVE REGISTERS
- PUSH ES
- PUSH BP
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH DI
- PUSH SI
-
- PUSH CS ;SET DS = CS
- POP DS
- CALL IN_SAVE ;SAVE PARAMETERS
- MOV BP,WORD PTR CURRENT_IF
- INC BP ;POINT AT PPI_PB
- MOV BYTE PTR STA_CODE,0
- MOV BYTE PTR READ_MODE,0 ;2048 mode
- START_EXT_0:
- CMP AH_SAVE,19H
- JNE START_EXT_2
- MOV AX,SI_SAVE
- CMP AH,19H
- JNE START_EXT_1
- JMP COM_ER
- START_EXT_1: ;EXTENDED COMMAND
- MOV AH_SAVE,AH
- MOV AL_SAVE,AL
- START_EXT_2:
- CMP AH_SAVE,1AH
- JNE START_0
- MOV BYTE PTR READ_MODE,1 ;2352 mode
- MOV AH_SAVE,6 ;READ EXT
- START_0:
- CMP AH_SAVE,17H ;MODE_SET command?
- JE START_1
- CMP MAX_DRIVE,0
- JNZ START_2
- CALL CHK_MAX
- START_2:
- CMP MAX_DRIVE,7
- JNZ START_3
- START_3:
- MOV DL,DL_SAVE
- CMP DL,MAX_DRIVE
- JBE START_31
- JMP short PAR_ER
- START_31:
- SHL DL,1
- SHL DL,1
- SHL DL,1
- OR DL,MASK_DS0
- CMP DL_SAVE,4
- JB START_4 ;DS0-3
- AND DL,MASK_DS4 ;DS4-7
- START_4:
- MOV DRIVE_NO_MASK,DL ;GET DRIVE SELECT MASK
- MOV AH,AH_SAVE
- CMP AH,18H
- JA COM_ER
- START_1:
- MOV AL,AH_SAVE
- SHL AL,1 ;GET OFFSET INTO FUNCTION TABLE
- LEA DI,FUNCTBL ;GET ADDRESS OF FUNCTION TABLE
- XOR AH,AH
- ADD DI,AX ;GET JUMP VECTOR
- JMP WORD PTR[DI] ;JUMP TO FUNCTION
- ;-----------------------------
- ; < MAX D_NO CHECK>
- ;-----------------------------
- CHK_MAX PROC NEAR
- MOV MAX_DRIVE,3
- PPI_CR ;SET PPI PORT_A INPUT MODE
- MOV AL,PAIN ;
- OUT DX,AL ; PPI_CR <- PAIN
- PPI_PC ;PPI_PC
- MOV AL,CLR_IN ; LOAD CLEAR & BUS_DIR IN CODE
- OR AL,MASK_DS0
- JMP $+2
- OUT DX,AL ; CLEAR & BUS_DIR IN
-
- CHK_MAX_0:
- PPI_PB
- IN AL,DX ;LOAD PPI PORT_B
- AND AL,03CH ;MASK DRIVE NO
- CMP AL,24H ;CHECK I/F ID
- JE CHK_MAX_1
- RET ;MAX 4 DIRVES
- ;
- CHK_MAX_1:
- PPI_PC ;PPI_PC
- MOV AL,CLR_IN ; LOAD CLEAR & BUS_DIR IN CODE
- OR AL,MASK_DS0
- OR AL,18H ;DRIVE No.3
- JMP $+2
- OUT DX,AL ; CLEAR & BUS_DIR IN
- ;
- CHK_MAX_00:
- PPI_PB
- IN AL,DX ;LOAD PPI PORT_B
- AND AL,03CH ;MASK DRIVE NO
- CMP AL,3CH ;CHECK I/F ID
- JE CHK_MAX_2
- RET ;MAX 4 DRIVES
-
- CHK_MAX_2:
- MOV MAX_DRIVE,7
- RET
- CHK_MAX ENDP
- ;-----------------------------
- ; < INT >
- ;-----------------------------
- INT_OFF PROC NEAR
- RET ;DUMMY
- INT_OFF ENDP
-
- ;-----------------------------
- ; < COMMON EXIT >
- ;-----------------------------
- N_RT: XOR AH,AH ;RESET CARRY
- CLC
- EXIT:
- STI
- POP SI ;RESTORE ALL OF THE REGISTERS
- POP DI
- POP DX
- POP CX
- POP BX
- POP BP
- POP ES
- POP DS
- RET
- ;-----------------------------
- ; < ERROR RETURN >
- ;-----------------------------
- COM_ER:
- ERROR_COM:
- MOV AH,BAD_COM ;LOAD BAD_COMMAND CODE
- JMP SHORT ERR_RT ;JUMP TO ERROR RETURN
- PAR_ER: MOV AH,BAD_PARA ;LOAD BAD PARAMETER CODE
- JMP SHORT ERR_RT ;JUMP TO ERROR RETURN
- DR_ER: MOV AH,NOT_READY ;LOAD DRIVE NOT READY CODE
- JMP SHORT ERR_RT ;JUMP TO ERROR RETURN
- SEK_ER: MOV AH,SEEK_ER ;LOAD SEEK ERROR CODE
- JMP SHORT ERR_RT ;JUMP TO ERROR RETURN
- TIM_ER: MOV AH,TIME_OUT ;LOAD TIME OUT ERROR CODE
- JMP SHORT ERR_RT ;JUMP TO ERROR RETURN
- OTHER: MOV AH,OTHER_ER ;LOAD OTHER ERROR CODE
- JMP SHORT ERR_RT ;JUMP TO ERROR RETURN
- ECC_ER: MOV AH,BAD_ECC ;LOAD BAD ECC ERROR CODE
- ERR_RT: STC ;ERROR RETURN
- JMP EXIT ;EXIT
- ;----------------------------------------------------------------------
- ; INIT
- ;
- INIT:
- MOV ERRCNT,RETRY2
- ;
- ; 07/16/90, don't reset the clock mode
- ; MOV CLOCK_MODE,0FFH ;CLEAR CLOCK MODE
- ;
- CALL GET_DRIVE_OFF
- MOV BYTE PTR CURRENT_DRIVE[SI],0FFH
- PPI_CR
- MOV AL,PAIN ; PORT A,B INPUT
- OUT DX,AL ; PORT C OUTPUT
- DEC DX ; DX <-- PPI_PC_AD
- MOV AL,CLR_IN ; CLEAR PPI_PC
- OR AL,DRIVE_NO_MASK
- OUT DX,AL ; PORT_C <- 82H
- INIT_1:
- CALL RESET_COMMAND ;ISSUE RESET COMMAND
- JZ INIT_RETRY_1
- INIT_2:
- CALL CHK_DRV ;CHECK DRIVE TYPE
- JB INIT_RETRY_3
- INIT_4:
- CALL CHK_DR ;CHECK DRIVE READY
- JZ INIT_RETRY_2
- CALL GET_DRIVE_OFF
- MOV AL,BYTE PTR CURRENT_DRIVE[SI]
- JMP N_RT
- INIT_RETRY_1:
- DEC ERRCNT
- JNZ INIT_1
- JMP SHORT INIT_TIM_ER
- INIT_RETRY_2:
- DEC ERRCNT
- JNZ INIT_4
- CALL GET_DRIVE_OFF
- MOV AL,BYTE PTR CURRENT_DRIVE[SI]
- JMP DR_ER ;ERROR!! DRIVE NOT READY
- INIT_RETRY_3:
- DEC ERRCNT
- JNZ INIT_2
- INIT_TIM_ER:
- CALL GET_DRIVE_OFF
- MOV AL,BYTE PTR CURRENT_DRIVE[SI]
- JMP TIM_ER
- ;----------------------------------------------------------------------
- ; DISK READ
- ;
-
- ifdef DEBUG
- public READ_EXT
- endif
-
- READ_EXT:
- MOV AX,DI_SAVE
- MOV CD_TOTAL,AX
- JMP SHORT INPUT_READ
- INPUT:
- MOV AL,AL_SAVE
- XOR AH,AH
- MOV CD_TOTAL,AX
- INPUT_READ:
- CMP AX,0
- JE INPUT_RD_ER
- INPUT_RD_0:
- CALL PARAMETER_CHECK
- JNC INPUT_1
- INPUT_RD_ER:
- JMP PAR_ER
- INPUT_1:
- MOV TRNS_MODE,1 ;DMA
- CMP CURRENT_IF_MODE,1 ;CANNOT SOFT TRNS ?
- JE INPUT_0_B
- CMP MODE_SET_TRNS,1 ;DMA MODE ?
- JE INPUT_0_B
- CMP CLOCK_MODE,80H
- JE INPUT_0_B
- MOV TRNS_MODE,0 ;SOFT TRNS
- INPUT_0_B:
- XOR AX,AX
- MOV CD_CNT,AX ;CLEAR CD_CNT
- IN_00:
- MOV BYTE PTR ERRCNT,RETRY ;PRESET ERROR COUNTER
- IN_5:
- XOR AL,AL
- MOV BYTE PTR PAUSE_FLG,AL ;CLEAR PAUSE FLAG
- CALL READ_COMMAND ;READ ONE DATA BLOCK
- JNZ IN_5_0
- CALL READ_COMMAND
- JNZ IN_5_0 ; JUMP IF ERROR
- JMP INE_3 ;TIME OUT ERROR
- IN_5_0:
- CALL CHK_DR_INPUT
- mov time_2,T_OVER5
- call set_time_2 ;SET 5 SEC
- JNZ IN_NEXT
- IN_5_1:
- JMP INE_1
- IN_1: mov time_2,T_OVER5
- call set_time_2 ;SET 5 SEC
- IN_10: CALL STATUS_COMMAND ; READ CD-ROM STATUS
- JZ IN_5_1 ; JUMP IF ERROR
- MOV BX,10
- IN_10_S:
- DEC BX
- JNZ IN_10_S
- IN_NEXT:
- MOV AL,BYTE PTR STA_CODE ; LOAD STATUS
- AND AL,0FEH ; MASK BUSY
- JNZ IN_6 ; JUMP IF SEEK COMPLETE
- IN_NEXT_1:
-
- call check_time_2
-
- JNZ IN_10 ; LOOP UNTIL DATA READY
- IN_NEXT_2:
- MOV STA_CODE,SEEK_ERR
- JMP short INE_1 ; TIME OUT ERROR
- IN_6:
-
- call check_time_2
-
- JZ IN_NEXT_2 ; LOOP UNTIL DATA READY
- TEST AL,62H ; CHECK ERROR
- JNZ INE_1
- TEST AL,DATA_READY ; TEST DATA READY?
- JZ IN_10 ; JUMP IF DATA IS NOT READY
- XOR BX,BX
- IN_6_1:
- DEC BX
- JZ INE_1 ;TIME OUT
- IN_PB
- TEST AL,BUS_BUSY
- JZ IN_6_1
- MOV AL,STA_CODE ;------ added 4/2
- TEST AL,DATA_ERR ; CHECK DATA ERROR?
- JNZ IN_2 ; JUMP IF ERROR HAPPEND
- CALL SECREAD ; READ DATA
- JZ IN_NEXT_2 ; JUMP IF BAD ID
- JMP SHORT IN_3 ;
- IN_2: CALL ER_CORRECT ; READ DATA AND CORRECT ERROR
- JC INE_8 ; JUMP IF BAD ECC
- JZ IN_NEXT_2 ; JUMP IF BAD ID
- JMP SHORT IN_33
- IN_3:
- CALL STATUS_COMMAND
- JZ INE_1 ;TIME OUT
- TEST BYTE PTR STA_CODE,62H ;CHECK LOST DATA,SEEK ERROR,DR NOT READY
- JNZ INE_1 ;LOST DATA ERROR
- IN_33: INC CD_CNT ;INCREMENT CD_CNT
- MOV AX,CD_TOTAL
- CMP AX,CD_CNT ;DONE ALL BLOCKS?
- JNA IN_RT ;JUMP IF ALL BLOCKS HAVE BEEN SENT
- IN_4:
- CMP READ_MODE,0
- JNE IN_4_0
- CALL UPDATE ;UPDATE DATA BLOCK
- JC INE_5 ;JUMP IF DATA BLOCK IS OUT OF RANGE
- JMP SHORT IN_4_1
- IN_4_0:
- CALL UPDATE_2352
- JC INE_5
- IN_4_1:
- TEST BYTE PTR PAUSE_FLG,0FFH ;CHECK DRIVE IS "PAUSE" OR NOT
- JZ IN_7 ; JUMP IF DRIVE IS "PLAY"
- JMP IN_00
- IN_7: MOV BYTE PTR ERRCNT,RETRY ;READ NEXT BLOCK
- mov time_2,T_OVER5
- call set_time_2 ;SET 5 SEC
- JMP IN_NEXT ;
- IN_RT: CALL PAUSE_COMMAND ;ALL BLOCKS HAVE BEEN SENT, ISSUE PAUSE COMMAND
- JMP N_RT ;NORMAL RETURN
- INE_1: DEC BYTE PTR ERRCNT ;DECREMENT ERROR COUNT
- JZ INE_2 ;NO MORE RETRY
- JMP IN_5 ;TRY AGAIN
- INE_2: MOV AL,BYTE PTR STA_CODE ;CHECK STATUS CODE
- TEST AL,0FEH ; TEST TIME OUT ERROR
- JZ INE_3 ;
- TEST AL,DRIVE_READY ; TEST DRIVE READY
- JNZ INE_4 ;
- TEST AL,SEEK_ERR ; TEST SEEK ERROR
- JNZ INE_7 ;
- JMP OTHER ;OTHER ERROR
- INE_8:
- DEC BYTE PTR ERRCNT
- JZ INE_6
- JMP IN_5
- INE_3: JMP TIM_ER ;TIME OUT ERROR
- INE_4: JMP DR_ER ;DRIVE NOT READY
- INE_5: JMP PAR_ER ;BAD PARAMETER
- INE_6: JMP ECC_ER ;ECC ERROR
- INE_7: JMP SEK_ER ;SEEK ERROR
- ;----------------------------------------------------------------------
- ;
- ; SEEK
- ;
- ;----------------------------------------------------------------------
- SEEK: CALL PARAMETER_CHECK ;CHECK PARAMETERS
- JNC SEEK_1
- JMP PAR_ER ;PARAMETER ERROR
- SEEK_1:
- MOV ERRCNT,RETRY2
- SEEK_2:
- CALL SEEK_COMMAND ;ISSUE SEEK COMMAND
- JZ SEEK_RETRY ;JUMP IF TIME OUT
- CALL SEEK_ERROR_CHK
- JZ SEEK_ER_TIM ;TIME OUT
- JC SEEK_RETRY ;SEEK ERROR
- JMP short N_RT_CHK ;CHECK DRIVE READY
- SEEK_RETRY:
- DEC ERRCNT
- JNZ SEEK_2
- SEEK_CHECK_SUB:
- MOV AL,STA_CODE
- TEST AL,SEEK_ERR
- JNZ SEEK_SEEK_ER
- TEST AL,DRIVE_READY
- JNZ SEEK_DR_RDY
- SEEK_ER_TIM:
- JMP TIM_ER
- SEEK_SEEK_ER:
- JMP SEK_ER
- SEEK_DR_RDY:
- JMP DR_ER
- ;----------------------------------------------------------------------
- ; ISSUE SEEK COMMAND AND WAIT UNTILL SEEK COMPLETE
- ;
- SEEKW: CALL PARAMETER_CHECK ;CHECK PARAMETERS
- JNC SEKW_0
- JMP PAR_ER
- SEKW_0:
- MOV ERRCNT,RETRY2
- SEKW_0_1:
- CALL SEEK_COMMAND ;ISSUE SEEK COMMAND
- JNZ SEKW_0_2
- JMP short SEKW_RETRY_1 ;JUMP IF TIME OUT ERROR
- SEKW_0_2:
- SEKW_1: CALL SEEK_ERROR_CHK ;ISSUE DISK STATUS COMMAND
- JZ SEEK_ER_TIM ;JUMP IF TIME OUT
- JC SEKW_RETRY_1 ;SEEK ERROR
- SEKW_2: mov time_2,T_OVER3
- call set_time_2 ;10 sec
- SEKW_6: CALL STATUS_COMMAND ; ISSUE DISK STATUS COMMAND
- JNZ SEKW_7 ; JUMP IF TIME OUT
- JMP TIM_ER
- SEKW_7:
- MOV AL,BYTE PTR STA_CODE ; CHECK SEEK COMPLETE
- TEST AL,DRIVE_BUSY ; TEST DRIVE BUSY
- JZ SEKW_4 ; JUMP IF DRIVE IS NOT BUSY
-
- call check_time_2
-
- JNZ SEKW_6 ;LOOP UNTIL SEEK COMPLETE
- JMP SEK_ER ;JUMP IF TIME OUT
- SEKW_4: JMP SHORT N_RT_CHK ;NORMAL RETURN
- ;
- SEKW_RETRY_1:
- DEC ERRCNT
- JNZ SEKW_0_1
- JMP SEEK_CHECK_SUB
- N_RT_CHK:
- CALL CHK_DR
- JNZ STATUS_S_2 ;NORMAL RETURN
- N_RT_CHK_1:
- JMP DR_ER ;DRIVE NOT READY
- ;----------------------------------------------------------------------
- ;
- ; STATUS READ
- ;
- ;----------------------------------------------------------------------
- STATUS:
- MOV ERRCNT,RETRY2
- STATUS_S_1:
- CALL STATUS_COMMAND ;ISSUE STATUS COMMAND
- JZ STATUS_RETRY ;JUMP IF TIME OUT ERROR
- MOV AL,BYTE PTR STA_CODE ;SET STATUS CODE IN AL
- STATUS_S_2:
- JMP N_RT
- STATUS_RETRY:
- DEC ERRCNT
- JNZ STATUS_S_1
- JMP TIM_ER
- ;----------------------------------------------------------------------
- ;
- ; DISK STATUS READ
- ;
- ;----------------------------------------------------------------------
- DISKST:
- MOV ERRCNT,RETRY2
- DISKST_1:
- CALL DSKSTA_COMMAND ;ISSUE DISK STATUS COMMAND
- JZ DISKST_RETRY ;JUMP IF TIME OUT ERROR
- MOV AL,BYTE PTR STA_CODE ;SET DISK STATUS CODE IN AL
- JMP N_RT ;
- DISKST_RETRY:
- DEC ERRCNT
- JNZ DISKST_1
- JMP TIM_ER
- ;----------------------------------------------------------------------
- ;
- VERSION:
- ;
- ;----------------------------------------------------------------------
- MOV ERRCNT,RETRY2
- VERSION_1:
- CALL VERSION_COMMAND
- JZ VERSION_RETRY
- JMP N_RT
- VERSION_RETRY:
- DEC ERRCNT
- JNZ VERSION_1
- JMP TIM_ER
- ;--------------------------------------------------------------------
- ;
- SEEK_TO_LEAD:
- ;
- ;--------------------------------------------------------------------
- MOV ERRCNT,RETRY2
- SEEK_T_1:
- CALL SEEK_LEAD_COMMAND
- JZ SEEK_T_RETRY
- CALL CHK_DR
- JZ SEEK_T_RETRY
- JMP N_RT
- SEEK_T_RETRY:
- DEC ERRCNT
- JNZ SEEK_T_1
- INE_3_S:
- JMP SEEK_CHECK_SUB
- ;-------------------------------------------------------------------
- ;
- READ_SUBQ:
- ;
- ;-------------------------------------------------------------------
- MOV ERRCNT,RETRY2
- READ_SUBQ_1:
- CALL READ_SUBQ_COMMAND
- JZ READ_SUBQ_RETRY
- JMP N_RT
- READ_SUBQ_RETRY:
- DEC ERRCNT
- JNZ READ_SUBQ_1
- READ_SUBQ_ER:
- JMP TIM_ER
- ;-------------------------------------------------------------------
- ;
- AUDIO:
- ;
- ;-------------------------------------------------------------------
- CALL AUDIO_CHECK
- JC AUDIO_PAR_ER
- MOV AL_SAVE,0 ;OUTPUT L & R channel
- AUDIO_SUB:
- MOV ERRCNT,RETRY2
- AUDIO_1:
- CALL AUDIO_COMMAND
- JZ AUDIO_RETRY
- CALL SEEK_ERROR_CHK
- JZ READ_SUBQ_ER ;TIME OUT
- JC AUDIO_RETRY
- JMP N_RT_CHK
- AUDIO_RETRY:
- DEC ERRCNT
- JNZ AUDIO_1
- JMP SEEK_CHECK_SUB
- ;-------------------------------------------------------------------
- ;
- AUDIO_EXT:
- ;
- ;-------------------------------------------------------------------
- CALL AUDIO_CHECK
- JC AUDIO_PAR_ER
- CMP AL_SAVE,3
- JA AUDIO_PAR_ER
- JMP AUDIO_SUB
- ;-------------------------------------------------------------------
- AUDIO_TNO:
- CMP AL_SAVE,4
- JNB AUDIO_PAR_ER
- CMP CH_SAVE,100
- JAE AUDIO_PAR_ER
- CMP CL_SAVE,100
- JAE AUDIO_PAR_ER
- MOV AL,CL_SAVE
- CMP AL,CH_SAVE
- JB AUDIO_PAR_ER
- MOV ERRCNT,RETRY2
- AUDIO_TNO_1:
- CALL AUDIO_TNO_COMMAND
- JNZ AUDIO_TNO_2
- CALL AUDIO_TNO_COMMAND
- JZ OPEN_TIM ;TIME OUT
- AUDIO_TNO_2:
- CALL SEEK_ERROR_CHK
- JZ OPEN_TIM ;TIME OUT
- JC AUDIO_TNO_RETRY
- JMP N_RT_CHK
- AUDIO_TNO_RETRY:
- DEC ERRCNT
- JNZ AUDIO_TNO_1
- TEST BYTE PTR STA_CODE,DRIVE_READY
- JNZ AUDIO_TNO_DR
- JMP SEK_ER
- AUDIO_PAR_ER:
- JMP PAR_ER
- AUDIO_TNO_DR:
- JMP DR_ER
- ;-------------------------------------------------------------------
- OPEN:
- MOV ERRCNT,RETRY2
- OPEN_1:
- CALL OPEN_COMMAND
- JZ OPEN_RETRY
- JMP N_RT
- OPEN_RETRY:
- DEC ERRCNT
- JNZ OPEN_1
- OPEN_TIM:
- JMP TIM_ER
- ;-------------------------------------------------------------------
- CLOSE:
- MOV ERRCNT,RETRY2
- CLOSE_1:
- CALL CLOSE_COMMAND
- JZ CLOSE_RETRY
- JMP N_RT
- CLOSE_RETRY:
- DEC ERRCNT
- JNZ CLOSE_1
- JMP TIM_ER
- ;-------------------------------------------------------------------
- P_A_MED:
- CMP AL_SAVE,3
- JB P_A_MED_1
- JMP PAR_ER
- P_A_MED_1:
- MOV ERRCNT,RETRY2
- P_A_MED_2:
- CALL P_A_MED_COMMAND
- JZ P_A_MED_RETRY
- MOV AL,BYTE PTR STA_CODE ;SET STATUS CODE IN AL
- JMP N_RT
- P_A_MED_RETRY:
- DEC ERRCNT
- JNZ P_A_MED_2
- JMP TIM_ER
- ;-------------------------------------------------------------------
- SET_POWER:
- CMP AL_SAVE,20
- JBE SET_POWER_1
- JMP PAR_ER
- SET_POWER_1:
- MOV ERRCNT,RETRY2
- SET_POWER_2:
- CALL SET_POWER_COMMAND
- JZ SET_POWER_RETRY
- JMP N_RT
- SET_POWER_RETRY:
- DEC ERRCNT
- JNZ SET_POWER_2
- JMP TIM_ER
- ;------------------------------------------------------------------
- STOP:
- MOV ERRCNT,RETRY2
- STOP_1:
- CALL STOP_COMMAND
- JZ STOP_RETRY
- JMP N_RT
- STOP_RETRY:
- DEC ERRCNT
- JNZ STOP_1
- JMP TIM_ER
- ;------------------------------------------------------------------
- PAUSE:
- MOV ERRCNT,RETRY2
- PAUSE_1:
- CALL PAUSE_COMMAND
- JZ PAUSE_RETRY
- CALL CHK_DR
- JZ PAUSE_RETRY
- JMP N_RT
- PAUSE_RETRY:
- DEC ERRCNT
- JNZ PAUSE_1
- JMP SEEK_CHECK_SUB
- ;------------------------------------------------------------------
- MODE_SET:
-
- MOV AL,AL_SAVE
- CMP AL,2
- JB MODE_SET_AUTO
- JE MODE_SET_1
- MODE_SET_ER:
- JMP PAR_ER
- MODE_SET_1:
- MOV MAX_DRIVE,0 ;CLEAR FLAG
- CALL NEW_IF
- JC MODE_SET_ER
- JMP SHORT MODE_N_RT
- MODE_SET_AUTO:
- MOV MODE_SET_TRNS,AL
- MODE_N_RT:
- JMP N_RT
- ;------------------------------------------------------------------
- UCOM:
- MOV ERRCNT,RETRY2
- UCOM_1:
- CALL UCOM_COMMAND
- JZ UCOM_RETRY
- JMP N_RT
- UCOM_RETRY:
- DEC ERRCNT
- JNZ UCOM_1
- JMP TIM_ER
- ;-------------------------------------------------------------------
- CH_CTRL:
- CMP AL_SAVE,3
- JBE CH_CTRL_1
- JMP PAR_ER
- CH_CTRL_1:
- MOV ERRCNT,RETRY2
- CH_CTRL_2:
- CALL CH_CTRL_COMMAND
- JZ CH_CTRL_RETRY
- MOV AL,BYTE PTR STA_CODE ;SET STATUS CODE IN AL
- JMP N_RT
- CH_CTRL_RETRY:
- DEC ERRCNT
- JNZ CH_CTRL_2
- JMP TIM_ER
- ;-------------------------------------------------------------------
- ;-------------------------------------------------------------------
- ;------------------------------------------------------------------
- GENERAL:
- MOV SI,SI_SAVE
- MOV AX,DI_SAVE
- MOV ES,AX
- CMP ES:WORD PTR [SI],'IH'
- JNE GENERAL_1 ;COMMAND ERROR
- CALL GENERAL_COMMAND
- JNZ MODE_N_RT
- CALL GENERAL_COMMAND
- JNZ MODE_N_RT
- JMP TIM_ER
- GENERAL_1:
- JMP ERROR_COM
- ;---------------------------------------------
- ; CHECK SEEK ERROR
- ; OUTPUT: ZR=1 -- TIME OUT
- ; CY=1 -- SEEK ERROR
- ; ZR=CY=0 - OK
- ;---------------------------------------------
- SEEK_ERROR_CHK PROC NEAR
- mov time_2,T_OVER3
- call set_time_2 ;SET 10 SEC
- SEEK_ERR_CHK_0:
- MOV STA_CODE,0
- CALL STATUS_COMMAND
- JNZ SEEK_ERR_CHK_1
- MOV STA_CODE,0
- CALL STATUS_COMMAND
- JNZ SEEK_ERR_CHK_1
- RET ;TIME OVER
- SEEK_ERR_CHK_1:
- MOV AL,STA_CODE
- TEST AL,SEEK_ERR
- JNZ SEEK_ERR_NG ;SEEK ERROR
- TEST AL,DRIVE_BUSY
- JNZ SEEK_ERR_CHK_2
-
- call check_time_2
-
- JNZ SEEK_ERR_CHK_0
- SEEK_ERR_NG:
- OR AL,1
- STC
- RET
- SEEK_ERR_CHK_2:
- OR AL,1 ;RESET ZR
- CLC ;OK
- RET
- SEEK_ERROR_CHK ENDP
- ;--------------------------------------
- PARAMETER_CHECK PROC NEAR
- CMP CD_MIN,MAX_MINUTE
- JAE PARAMETER_ERROR
- CMP CD_SEC,MAX_SECOND
- JAE PARAMETER_ERROR
- CMP CD_BLK,MAX_BLOCK
- JAE PARAMETER_ERROR
- PARAMETER_ERROR:
- CMC
- RET
- PARAMETER_CHECK ENDP
- ;----------------------------------------
- AUDIO_CHECK PROC NEAR
- MOV BX,MYDTA_OFF
- MOV AX,MYDTA_SEG
- MOV DS,AX
- CMP BYTE PTR [BX],MAX_MINUTE
- JAE AUDIO_CHK_ERROR
- CMP BYTE PTR [BX+1],MAX_SECOND
- JAE AUDIO_CHK_ERROR
- CMP BYTE PTR [BX+2],MAX_BLOCK
- JAE AUDIO_CHK_ERROR
- CMP BYTE PTR [BX+3],MAX_MINUTE
- JAE AUDIO_CHK_ERROR
- CMP BYTE PTR [BX+4],MAX_SECOND
- JAE AUDIO_CHK_ERROR
- CMP BYTE PTR [BX+5],MAX_BLOCK
- AUDIO_CHK_ERROR:
- MOV AX,CS
- MOV DS,AX
- CMC
- RET
- AUDIO_CHECK ENDP
-
- ;----------------------------------------------------------------------
- ; NEW IF
- ;----------------------------------------------------------------------
- NEW_IF PROC NEAR
- MOV AX,CS
- MOV ES,AX
- MOV AL,CL_SAVE
- MOV AH,CH_SAVE
- CMP AX,100H
- JB NEW_IF_ER
- CMP AX,3FFH
- JA NEW_IF_ER
- AND AX,03F0H ;GET NEW I/F ADDRESS
- CMP AX,CURRENT_IF
- JE NEW_IF_RET
- MOV CURRENT_IF,AX
- MOV DI,OFFSET CURRENT_IF_MODE
- MOV AL,0FFH
- MOV CX,9 ;1+8
- REP STOSB
- NEW_IF_RET:
- CLC
- RET
- NEW_IF_ER:
- STC
- RET
- NEW_IF ENDP
-
-
- ;---------------------------------------------------------------------
- ; check drive type
- ;---------------------------------------------------------------------
- CHK_DRV PROC NEAR
- CHK_DRV_LOOP_1:
- MOV TWICE,1
- CHK_DRV_LOOP_2:
- MOV AX,CS
- MOV ES_SAVE,AX
- MOV AX,OFFSET BUF
- MOV BX_SAVE,AX
- CALL VERSION_COMMAND
- JNE CHK_DRV_23_1
- CALL VERSION_COMMAND
- JZ CHK_TIM_ER
- CHK_DRV_23_1:
- CMP WORD PTR BUF,0FFFFH
- JE CHK_DRV_12
- MOV AL,BYTE PTR BUF+51
- AND AL,7FH
- JMP SHORT CHK_DRV_TWICE
- ;
- CHK_DRV_12: ;CHECK 1502 OR 2500
- CALL READ_PORT_COMMAND
- JNZ CHK_DRV_1
- CALL READ_PORT_COMMAND
- JZ CHK_TIM_ER
- CHK_DRV_1:
- MOV AL,20H
- CMP WORD PTR BUF+2,0FFFFH
- JNE CHK_DRV_TWICE
- CMP WORD PTR BUF+6,0FFFFH
- JNE CHK_DRV_TWICE
- XOR AL,AL
- CHK_DRV_TWICE:
- CMP TWICE,0
- JE CHK_DRV_2
- MOV CHK_DRV_WORK,AL
- DEC TWICE
- JMP CHK_DRV_LOOP_2 ;2nd CHECK
- ;
- CHK_TIM_ER:
- STC
- ; JMP CHK_DRV_4
- RET
- ;
- CHK_DRV_2:
- CMP AL,CHK_DRV_WORK
- JE CHK_DRV_3
- MOV CHK_DRV_WORK,AL
- JMP CHK_DRV_LOOP_1 ;TRY AGAIN
- CHK_DRV_3:
- CALL GET_DRIVE_OFF
- MOV BYTE PTR CURRENT_DRIVE[SI],AL
- CLC
- CHK_DRV_4:
- ; POP AX
- RET
- ;
- GET_DRIVE_OFF:
- PUSH DX
- MOV DL,CS:DL_SAVE
- XOR DH,DH
- MOV SI,DX ;OFFSET
- POP DX
- RET
- CHK_DRV ENDP
-
-
- ;---------------------------------------------------------------------
- ;
- ; set_time_1() - check_time_1()
- ; set_time_2() - check_time_2()
- ;
- ; Uses the 18Hz system timer long integer located at 40:6C to establish
- ; timing wait loops for CDREAD routines.
- ;
- ;---------------------------------------------------------------------
- set_time_1 proc near
- pushf
- push bx
- push ds
- mov bx,40h
- mov ds,bx
- mov bx,06ch
- mov bx,word ptr [bx]
- pop ds
- add word ptr time_1,bx
- pop bx
- popf
- ret
- set_time_1 endp
-
- set_time_2 proc near
- pushf
- push bx
- push ds
- mov bx,40h
- mov ds,bx
- mov bx,06ch
- mov bx,word ptr [bx]
- pop ds
- add word ptr time_2,bx
- pop bx
- popf
- ret
- set_time_2 endp
-
- check_time_1 proc near
- push ax
- push bx
- push ds
- mov ax,40h
- mov ds,ax
- mov bx,06ch
- mov ax,word ptr [bx]
- pop ds
- cmp ax,word ptr time_1
- jb @f
- xor ax,ax
- @@: pop bx
- pop ax
- ret
- check_time_1 endp
-
- check_time_2 proc near
- push ax
- push bx
- push ds
- mov ax,40h
- mov ds,ax
- mov bx,06ch
- mov ax,word ptr [bx]
- pop ds
- cmp ax,word ptr time_2
- jb @f
- xor ax,ax
- @@: pop bx
- pop ax
- ret
- check_time_2 endp
-
-
- CDREAD ENDP
-
- _TEXT ENDS
- END BEGIN
-